package com.wego.controller.manager.base;

import com.wego.service.base.BaseService;
import com.wego.common.bean.ResultBean;
import com.wego.common.enumeration.ResultEnum;
import com.wego.common.utils.ResultBeanUtil;
import com.wego.common.utils.StringUtil;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 * 控制器基类
 *
 * @author: hc
 * @date: 2023/7/19 13:33
 */
public class BaseController<T> {
    /**
     * 泛型T对应的首字母小写的实体类类名，比如PayMethod--payMethod
     */
    private String objName;
    /**
     * 泛型T对应的实体类表页面名，比如PayMethod--pay_method
     */
    private String pageName;

    /**
     * 服务基类
     */
    private BaseService<T> baseService;

    /**
     * 不提供默认的构造方法，限制其子类必须调用该方法为baseService赋值
     * @param service
     */
    public BaseController(BaseService<T> service) {
        this.baseService = service;
        //获取泛型类的类型
        Type type = ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        //获取泛型类的类名
        String clazzName = ((Class) type).getSimpleName();
        //System.out.println(type.getTypeName());

        //首字母小写
        objName = StringUtil.first2Lower(clazzName);

        //驼峰转下划线
        pageName = StringUtil.hump2underscore(clazzName);
    }

    /**
     * 省份详情
     * @param id
     * @param model
     * @return
     */
    @GetMapping("/details")
    public String details(Long id, Model model) {
        T obj = baseService.selectByPrimaryKey(id);

        model.addAttribute(objName, obj);

        return "manager/" + pageName + "_details";
    }

    /**
     * 打开添加修改页面
     * @param id
     * @param model
     * @return
     */
    @GetMapping("/openAddUpdate")
    public String openAddUpdate(Long id, Model model) {
        T obj = baseService.selectByPrimaryKey(id);
        model.addAttribute(objName, obj);

        return "manager/" + pageName + "_add_update";
    }

    /**
     * 修改状态
     * @param obj
     * @return
     */
    @GetMapping("/changeState")
    public String changeState(T obj, RedirectAttributes redirectAttributes) {
        //修改状态的值，让MySQL数据库自己做，需要设置Update_time字段的默认值为CURRENT_TIMESTAMP
        //obj.setUpdateTime(LocalDateTime.now());

        boolean res = baseService.updateByPrimaryKeySelective(obj);

        //返回列表页面时，对话框中显示的提示信息
        ResultBean resultBean = ResultBeanUtil.build(res, ResultEnum.UPDATE_SUCCESS, ResultEnum.UPDATE_EXCEPTION);
        //返回列表页面时，对话框中显示的提示信息
        redirectAttributes.addFlashAttribute("resultBean", resultBean);

        return "redirect:list";
    }

    /**
     * 根据主键删除
     * @param id
     * @return
     */
    @GetMapping("/deleteById")
    public String deleteById(Long id, RedirectAttributes redirectAttributes) {
        boolean res = baseService.deleteByPrimaryKey(id);

        //返回列表页面时，对话框中显示的提示信息
        ResultBean resultBean = ResultBeanUtil.build(res, ResultEnum.DELETE_SUCCESS, ResultEnum.DELETE_EXCEPTION);
        //返回列表页面时，对话框中显示的提示信息
        redirectAttributes.addFlashAttribute("resultBean", resultBean);

        return "redirect:list";
    }

    /**
     * 批量删除
     * @param ids
     * @return
     */
    @GetMapping("/batchDelete")
    public String batchDelete(String ids, RedirectAttributes redirectAttributes) {
        boolean res = baseService.batchDelete(ids);

        //返回列表页面时，对话框中显示的提示信息
        ResultBean resultBean = ResultBeanUtil.build(res, ResultEnum.DELETE_SUCCESS, ResultEnum.DELETE_EXCEPTION);
        //返回列表页面时，对话框中显示的提示信息
        redirectAttributes.addFlashAttribute("resultBean", resultBean);

        return "redirect:list";
    }
}
